package com.huanf.write.bigData;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author: 35238
 * 功能: Workbook接口有三个实现类，如下
        * ① HSSFWorkbook 适用于03版本的xls表格
        * ② SXSSFWorkbook 适用于07版本的xlsx表格，比下面那个处理更快
        * ③ XSSFWorkbook 适用于07版本的xlsx表格 (只使用这个，虽然写入没有上限，但是这里只测试65536行，更有对比性。全程操作的都是磁盘)
 * 时间: 2023-12-22 09:16
 * 总结: 用了 8.941秒，输出表格的大小是1.748MB
 */
@Slf4j
public class Xlsx07WriterXSSF {

    //保存表格的位置。为了方便写的是项目路径
    String PATH = "E:\\桌面\\Java-Ready\\conf\\Excel\\";

    @Test
    void Xls03BigData() throws IOException {

        //计算操作数据的总时间 开始时间
        long start = System.currentTimeMillis();

        //--------------------------------计算操作数据的总时间 开始时间--------------------------------

        //创建一张表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("xlsx统计表");

        //从0开始，到65535，也就是共65536行
        for (int i = 0; i < 65536; i++) {
            //表格里的每一行
            Row row = sheet.createRow(i);
            //从0开始，到9，也就是共10列
            for (int j = 0; j < 10; j++) {
                //表格里的每一列
                Cell cell = row.createCell(j);
                cell.setCellValue("值"+j);//这个cell就是每一个单元格，往cell填入数据
            }
        }
        //生成一张表
        FileOutputStream xxfileOutputStream = new FileOutputStream(PATH + "bigData-XSSF-xlsx格式的07版本统计表.xlsx");
        workbook.write(xxfileOutputStream);//这是写出的关键操作。从java写出到表格
        xxfileOutputStream.close();
        log.info("bigData-XSSF-xlsx格式的07版本统计表 生成完毕");

        //---------------------------------------------------------------------------------------

        //计算操作数据的总时间 结束时间，单位秒
        long end = System.currentTimeMillis();
        System.out.println("XSSF-xlsx格式的07版本，写入65536行10列的总时间是: "+ (double) (end-start)/1000);
    }
}
